#include "uart7_lcd.h"
#include "usart.h"
#include "rte.h"
#include "adc2_rte.h"
static LCDFramePacket Lcd_Frame;

/*
 * 函数介绍: LCD串口通讯协议初始化
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void LCD_init(void)
{
    Lcd_Frame.sig.frame_header = LCD_HEAD;
    Lcd_Frame.sig.frame_length = LCD_FRAME_LEN;
    Lcd_Frame.sig.reserved = LCD_RESERVE;
    Lcd_Frame.sig.frame_tail = LCD_FRAME_END;
}

/*
 * 函数介绍: LCD串口协议发送
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void LCD_transmit(NFCTestStatus test_product_number,LCD_TestStatus data_type,uint32_t data)
{
    Lcd_Frame.sig.test_product_number = test_product_number;
    Lcd_Frame.sig.data_type = data_type;
    Lcd_Frame.sig.l_data.data = data;
    HAL_UART_Transmit(&huart7,Lcd_Frame.F_data,LCD_FRAME_LEN,1000);
}

/*
 * 函数介绍: 计算电压值，并按照协议格式发送
 * 参数:
 * 返回值: {*}
 * 备注:
 * 检测系统工作电压是否正常
 * 合格自检灯亮绿灯
 * 不合格亮红灯，并且蜂鸣3声
 */
void frock_lcd_showV(NFCTestStatus St)
{
    uint32_t dataA;
    float V_value = RTE_ADC2_CHANNEL_V(PC2_C_ADC2_INP0);         /*系统电压*/
    uint8_t int_part = (uint8_t)V_value;                          // 整数部分
    uint8_t decimal_part = (uint8_t)((V_value - int_part) * 100); // 小数部分（乘以100后取整）

    // 提取整数部分和小数部分的各个数字
    uint8_t digit1 = int_part / 10;     // 13的十位数是1
    uint8_t digit2 = int_part % 10;     // 13的个位数是3
    uint8_t digit3 = decimal_part / 10; // 25的十位数是2
    uint8_t digit4 = decimal_part % 10; // 25的个位数是5
    // 创建uint64_t变量，并将这些数字存储到特定的字节位置
    // 注意：这里的位移是基于大端字节序的，小端字节序的系统需要调整位移量
    dataA = ((uint32_t) digit4<< 24) |
            ((uint32_t) digit3<< 16) |
            ((uint32_t) digit2<< 8) |
            ((uint32_t) digit1);
    RTE_UART7_LCD_SHOW(St,INTERFACE_SWITCH,0x00000000);        
    RTE_UART7_LCD_SHOW(St, WORKSTATION_VOLTAGE, dataA);
}

/*
 * 函数介绍: 工装自检LCD显示
 * 参数:
 * 返回值: {*}
 * 备注:
 * 检测系统工作电压是否正常
 * 合格自检灯亮绿灯
 * 不合格亮红灯，并且蜂鸣3声
 */
void frock_self_checking_LCD(NFCTestStatus St,bool frock_check_result)
{
    /*界面显示工装电压值*/
    frock_lcd_showV(St);
    if (true == frock_check_result)
    {
        /*界面显示自检结果*/
        RTE_UART7_LCD_SHOW(St, WORKSTATION_SELF_CHECK, STATUS_QUALIFIED);
        /*合格自检灯亮绿灯*/
        RTE_GPIO_PIN_SET_LEVEL(GPIOD,OUT9_PD14_Pin,GPIO_PIN_SET);
        /* code */
    }
    else
    {
        /*界面显示自检结果*/
        RTE_UART7_LCD_SHOW(St, WORKSTATION_SELF_CHECK, STATUS_UNQUALIFIED);
        /*不合格亮红灯，并且蜂鸣3声*/
        RTE_GPIO_PIN_SET_LEVEL(GPIOD,OUT10_PD13_Pin,GPIO_PIN_SET);
        RTE_BUZZER_ALARM(3);
    }
}
